]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
WindowManager: handle move-to-workspace keybindings
authorGiovanni Campagna <gcampagna@src.gnome.org>
Sat, 14 Apr 2012 13:29:54 +0000 (15:29 +0200)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Wed, 27 Jun 2012 17:35:37 +0000 (19:35 +0200)
Install a custom handler for move-to-workspace-* keybindings that
shows the workspace switcher, which gives the user a sense of
direction when navigating with the keyboard.

https://bugzilla.gnome.org/show_bug.cgi?id=674104

js/ui/windowManager.js

index 429253732180b95f11895b5fd0c7edff4baa1508..269cd4787d79b03e61372054df4dfe26e2eb2d10 100644 (file)
@@ -125,6 +125,14 @@ const WindowManager = new Lang.Class({
                                             Lang.bind(this, this._showWorkspaceSwitcher));
         Meta.keybindings_set_custom_handler('switch-to-workspace-down',
                                             Lang.bind(this, this._showWorkspaceSwitcher));
+        Meta.keybindings_set_custom_handler('move-to-workspace-left',
+                                            Lang.bind(this, this._showWorkspaceSwitcher));
+        Meta.keybindings_set_custom_handler('move-to-workspace-right',
+                                            Lang.bind(this, this._showWorkspaceSwitcher));
+        Meta.keybindings_set_custom_handler('move-to-workspace-up',
+                                            Lang.bind(this, this._showWorkspaceSwitcher));
+        Meta.keybindings_set_custom_handler('move-to-workspace-down',
+                                            Lang.bind(this, this._showWorkspaceSwitcher));
         Meta.keybindings_set_custom_handler('switch-windows',
                                             Lang.bind(this, this._startAppSwitcher));
         Meta.keybindings_set_custom_handler('switch-group',
@@ -563,24 +571,40 @@ const WindowManager = new Lang.Class({
         if (this._workspaceSwitcherPopup == null)
             this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup();
 
-        if (binding.get_name() == 'switch-to-workspace-up')
-            this.actionMoveWorkspace(Meta.MotionDirection.UP);
-        else if (binding.get_name() == 'switch-to-workspace-down')
-            this.actionMoveWorkspace(Meta.MotionDirection.DOWN);
-        else if (binding.get_name() == 'switch-to-workspace-left')
-            this.actionMoveWorkspace(Meta.MotionDirection.LEFT);
-        else if (binding.get_name() == 'switch-to-workspace-right')
-            this.actionMoveWorkspace(Meta.MotionDirection.RIGHT);
+        let [action,,,direction] = binding.get_name().split('-');
+        let direction = Meta.MotionDirection[direction.toUpperCase()];
+
+        if (action == 'switch')
+            this.actionMoveWorkspace(direction);
+        else
+            this.actionMoveWindow(window, direction);
     },
 
     actionMoveWorkspace: function(direction) {
         let activeWorkspace = global.screen.get_active_workspace();
         let toActivate = activeWorkspace.get_neighbor(direction);
 
-        if (toActivate && activeWorkspace != toActivate)
+        if (activeWorkspace != toActivate)
             toActivate.activate(global.get_current_time());
 
         if (!Main.overview.visible)
             this._workspaceSwitcherPopup.display(direction, toActivate.index());
     },
+
+    actionMoveWindow: function(window, direction) {
+        let activeWorkspace = global.screen.get_active_workspace();
+        let toActivate = activeWorkspace.get_neighbor(direction);
+
+        if (activeWorkspace != toActivate) {
+            // This won't have any effect for "always sticky" windows
+            // (like desktop windows or docks)
+            window.change_workspace(toActivate);
+
+            global.display.clear_mouse_mode();
+            toActivate.activate_with_focus (window, global.get_current_time());
+        }
+
+        if (!Main.overview.visible)
+            this._workspaceSwitcherPopup.display(direction, toActivate.index());
+    },
 });